package gest;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import java.sql.*;
import java.util.Scanner;

public class Medico_Impl extends UnicastRemoteObject implements Medico {

	private int nlicenca;
	private String nome;
	private String especialidade;
	private int id;
	public static Connection conn;

	public Medico_Impl(int nlicenca) throws RemoteException {
		this.nlicenca = nlicenca;
		Statement st;
		ResultSet rs;
		if (conn == null)
			conn = DBConnection.get_conn();
		try {
			st = conn.createStatement();
			String query = "select me.nome, es.nome, idMed from (select nome, idEspecialidade, idMed from Medicos where licenca="
					+ nlicenca
					+ ") me, especialidades es where me.idEspecialidade=es.idEsp";
			rs = st.executeQuery(query);
			if (rs.first()) {
				this.nome = rs.getString(1);
				this.especialidade = rs.getString(2);
				this.id = rs.getInt(3);
			} else {
				st.execute("insert into Medicos (licenca) values (" + nlicenca
						+ ")", st.RETURN_GENERATED_KEYS);
				rs = st.getGeneratedKeys();
				rs.first();
				this.id = rs.getInt(1);
				this.nome = "Nao inserido";
				this.especialidade = "Nao inserido";
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public int get_nlicenca() throws RemoteException {
		return nlicenca;
	}

	public String get_nome() throws RemoteException {
		return this.nome;
	}

	public String get_especialidade() throws RemoteException {
		return this.especialidade;
	}

	public boolean set_nome(String nome) throws RemoteException {
		if (!this.nome.equals(nome)){
			if (update_field("nome", nome)) {
			this.nome = nome;
			}
		}
		return true;
	}

	public boolean set_especialidade(String especialidade)
			throws RemoteException {
		if (!this.especialidade.equals(especialidade)){
			int esp = numEsp(especialidade.toUpperCase());
			if (this.update_field("idEspecialidade", esp)) {
				this.especialidade = especialidade;
			}
		}
		return true;
	}

	private boolean update_field(String field, Object Value) {
		Statement st;
		try {
			if (conn == null)
				conn = DBConnection.get_conn();
			st = conn.createStatement();
			String query = "update Medicos set " + field + "='"
					+ Value.toString() + "' where licenca=" + this.nlicenca;
//			System.err.println(query);
			st.execute(query);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return true;
	}

	private int numEsp(String esp) {
		int num = -1;
		Statement st;
		ResultSet rs;
		if (conn == null)
			conn = DBConnection.get_conn();
		try {
			st = conn.createStatement();
			String query = "select idEsp from Medicos,especialidades where Medicos.idEspecialidade=especialidades.idEsp and especialidades.nome='"
					+ esp + "'";
			rs = st.executeQuery(query);
			if (rs.first()) {
				num = rs.getInt(1);
			} else {
				Especialidade ce;
				try {
					System.out.println("Tem a certeza que pretende criar a especialidade: "+esp+" sim[s] ou nao[n]");
					Scanner in = new Scanner(System.in);
					String a = in.nextLine();
					if (a.equals("s")){
					ce = new Especialidade_Impl(esp);
					num = ce.get_id();
					}else System.exit(0);
				} catch (RemoteException e) {
					e.printStackTrace();
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return num;
	}
}